library(shiny)
Registered S3 methods overwritten by 'htmltools':
method from
print.html tools:rstudio
print.shiny.tag tools:rstudio
print.shiny.tag.list tools:rstudio
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
── Attaching packages ─────────────────────────────────────────────────────── tidyverse 1.3.2 ──✔ ggplot2 3.3.6 ✔ purrr 0.3.4
✔ tibble 3.1.8 ✔ dplyr 1.0.9
✔ tidyr 1.2.0 ✔ stringr 1.4.0
✔ readr 2.1.2 ✔ forcats 0.5.1── Conflicts ────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
obps_df <- read_csv("../order-book-plot-find/cum_errors/resources/for_web_app/LKOH-GMKN-2007-10-08-09_obps.csv")
Rows: 394482 Columns: 12── Column specification ────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): SECCODE, BUYSELL
dbl (9): NO, TIME, ORDERNO, ACTION, PRICE, VOLUME, TRADENO, TRADEPRICE, OBPLOTNO
date (1): DATE
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# obps_df <- read_csv("../order-book-plot-find/cum_errors/resources/for_web_app/LKOH-2007-10-08_obps.csv")
# obps_df <- read_csv("../order-book-plot-find/cum_errors/resources/for_web_app/s1_s2_2007_obps.csv")
obps_df <- obps_df %>%
mutate(TIME_S = TIME/1000)
obps_df
order_atts_cumsums_df <- read_csv("../order-book-plot-find/cum_errors/resources/for_web_app/LKOH-GMKN-2007-10-08-09_order_atts_cumsums.csv")
Rows: 394482 Columns: 32── Column specification ────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (2): ATT, SECCODE
dbl (28): VAL, NO, OBPLOTNO, SHAREBAL, BPROFIT, SPROFIT, OBPMINTPRICE, OBPMAXTPRICE, CBOVOL...
dttm (1): DATETIMEMLLS
date (1): DATE
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# order_atts_cumsums_df <- read_csv("../order-book-plot-find/cum_errors/resources/for_web_app/LKOH-2007-10-08_order_atts_cumsums.csv")
# order_atts_cumsums_df <- read_csv("../order-book-plot-find/cum_errors/resources/for_web_app/s1_s2_2007_order_atts_cumsums.csv")
order_atts_cumsums_df
obp_cum_atts_df <- read_csv("../order-book-plot-find/cum_errors/resources/for_web_app/LKOH-GMKN-2007-10-08-09_obp_cum_atts.csv")
Rows: 75021 Columns: 6── Column specification ────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): SECCODE, BUYSELLOBP, TRADESNOTRADES
dbl (2): OBPLOTNO, TRADEVOL
date (1): DATE
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# obp_cum_atts_df <- read_csv("../order-book-plot-find/cum_errors/resources/for_web_app/LKOH-2007-10-08_obp_cum_atts.csv")
# obp_cum_atts_df <- read_csv("../order-book-plot-find/cum_errors/resources/for_web_app/s1_s2_2007_obp_cum_atts.csv")
obp_cum_atts_df
order_atts_cumsums_enhanced_df <- left_join(order_atts_cumsums_df,
obps_df %>% select(-OBPLOTNO, -SECCODE),
by = c("NO", "DATE")) %>%
select(NO, SECCODE, DATETIMEMLLS, PRICE, TRADEPRICE, VOLUME,
DATE, TIME_S, OBPLOTNO, ATT, VAL,
SHAREBAL, BPROFIT, SPROFIT, OBPMINTPRICE, OBPMAXTPRICE,
CBOVOLtdcs, CSOVOLtdcs, BOVOLtdcs, SOVOLtdcs, BTVOLtdcs, STVOLtdcs,
CBOVOLobpcs, CSOVOLobpcs, BOVOLobpcs, SOVOLobpcs, BTVOLobpcs, STVOLobpcs,
sobp, bobp, max_sobp_bobp, minus_max_sobp_bobp, stday, btday, max_std_btd,
minus_max_std_btd)
order_atts_cumsums_enhanced_df
obp_minmax_atts_df <- order_atts_cumsums_enhanced_df %>%
select(SECCODE, DATE, OBPLOTNO,
DATETIMEMLLS, PRICE, TRADEPRICE) %>%
group_by(SECCODE, DATE, OBPLOTNO) %>%
summarise(OBPBEGIN = min(DATETIMEMLLS), OBPEND = max(DATETIMEMLLS),
OBPMINPRICE = min(PRICE), OBPMAXPRICE = max(PRICE))
`summarise()` has grouped output by 'SECCODE', 'DATE'. You can override using the `.groups` argument.
obp_minmax_atts_df
obp_cum_minmax_atts_df <- left_join(obp_cum_atts_df,
obp_minmax_atts_df %>% select(SECCODE,
DATE,
OBPLOTNO,
OBPBEGIN,
OBPEND,
OBPMINPRICE,
OBPMAXPRICE),
by = c("SECCODE", "DATE", "OBPLOTNO")) %>%
select(SECCODE, DATE, OBPLOTNO, TRADEVOL, BUYSELLOBP,
OBPBEGIN, OBPEND, OBPMINPRICE, OBPMAXPRICE,
TRADESNOTRADES) #, BUYSELLYIELD, OBPTDVOLRATIO, MINMAXRATIO)
obp_cum_minmax_atts_df
obp_cum_atts_enh_df <- inner_join(obp_cum_minmax_atts_df,
order_atts_cumsums_enhanced_df %>% select(SECCODE,
DATE,
OBPLOTNO,
BPROFIT,
SPROFIT),
by = c("SECCODE", "DATE", "OBPLOTNO")) %>%
select(SECCODE, DATE, OBPLOTNO, TRADEVOL, BUYSELLOBP,
BPROFIT, SPROFIT,
OBPBEGIN, OBPEND, OBPMINPRICE, OBPMAXPRICE,
TRADESNOTRADES) %>% #, BUYSELLYIELD, OBPTDVOLRATIO, MINMAXRATIO) %>%
rename("seccode" = "SECCODE",
"ddate" = "DATE",
"obplotno" = "OBPLOTNO",
"tradevol" = "TRADEVOL",
"buysellobp" = "BUYSELLOBP",
"bprofit" = "BPROFIT",
"sprofit" = "SPROFIT",
"obpbegin" = "OBPBEGIN",
"obpend" = "OBPEND",
"obpminprice" = "OBPMINPRICE",
"obpmaxprice" = "OBPMAXPRICE",
"bprofit" = "BPROFIT",
"sprofit" = "SPROFIT",
"tradesnotrades" = "TRADESNOTRADES") %>%
distinct()
# "buysellyield" = "BUYSELLYIELD",
# "obptdvolratio" = "OBPTDVOLRATIO",
# "minmaxratio" = "MINMAXRATIO")
obp_cum_atts_enh_df
td_vol_sum_df <- obp_cum_atts_enh_df %>%
group_by(seccode, ddate) %>%
summarise(tdvolsum = sum(tradevol))
`summarise()` has grouped output by 'seccode'. You can override using the `.groups` argument.
obp_cum_atts_enh_volarranged_df <- left_join(obp_cum_atts_enh_df,
td_vol_sum_df,
by = c("seccode", "ddate")) %>%
mutate(obpshareintd = tradevol / tdvolsum) %>%
select(-tdvolsum) %>%
arrange(seccode, ddate, desc(obpshareintd))
options(digits.secs = 3)
obp_cum_atts_enh_volarranged_df %>%
write_csv("../order-book-plot-find/cum_errors/resources/for_web_app/obp_cum_atts_enh_df.csv",
na = "")
obp_cum_atts_enh_volarranged_df
order_atts_cumsums_enh2_df <- order_atts_cumsums_enhanced_df %>%
mutate(pcolor = if_else(ATT == "BOVOL",
"aquamarine",
if_else(ATT == "SOVOL",
"coral",
"#004481")),
pshape = 4L,
psize = 0.5)
order_atts_cumsums_enh2_df
order_atts_cumsums_enh4_df <- order_atts_cumsums_enh2_df %>%
arrange(SECCODE, DATE, NO) %>%
rename("nno" = "NO",
"seccode" = "SECCODE",
"datetimemlls" = "DATETIMEMLLS",
"price" = "PRICE",
"tradeprice" = "TRADEPRICE",
"volume" = "VOLUME",
"ddate" = "DATE",
"ttime_s" = "TIME_S",
"obplotno" = "OBPLOTNO",
"att" = "ATT",
"val" = "VAL",
"sharebal" = "SHAREBAL") %>%
select(-BPROFIT, -SPROFIT, -OBPMINTPRICE, -OBPMAXTPRICE)
# options(digits.secs = 3)
order_atts_cumsums_enh4_df %>%
write_csv("../order-book-plot-find/cum_errors/resources/for_web_app/order_atts_cumsums_enh4_df.csv",
na = "")
order_atts_cumsums_enh4_df
LS0tDQp0aXRsZTogInByZXBhcmVfYmFsX3Rlc3RpbmdfZGZzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQpgYGB7cn0NCmxpYnJhcnkoc2hpbnkpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KYGBge3J9DQpvYnBzX2RmIDwtIHJlYWRfY3N2KCIuLi9vcmRlci1ib29rLXBsb3QtZmluZC9jdW1fZXJyb3JzL3Jlc291cmNlcy9mb3Jfd2ViX2FwcC9MS09ILUdNS04tMjAwNy0xMC0wOC0wOV9vYnBzLmNzdiIpDQojIG9icHNfZGYgPC0gcmVhZF9jc3YoIi4uL29yZGVyLWJvb2stcGxvdC1maW5kL2N1bV9lcnJvcnMvcmVzb3VyY2VzL2Zvcl93ZWJfYXBwL0xLT0gtMjAwNy0xMC0wOF9vYnBzLmNzdiIpDQojIG9icHNfZGYgPC0gcmVhZF9jc3YoIi4uL29yZGVyLWJvb2stcGxvdC1maW5kL2N1bV9lcnJvcnMvcmVzb3VyY2VzL2Zvcl93ZWJfYXBwL3MxX3MyXzIwMDdfb2Jwcy5jc3YiKQ0Kb2Jwc19kZiA8LSBvYnBzX2RmICU+JSANCiAgbXV0YXRlKFRJTUVfUyA9IFRJTUUvMTAwMCkNCm9icHNfZGYNCmBgYA0KDQoNCmBgYHtyfQ0Kb3JkZXJfYXR0c19jdW1zdW1zX2RmIDwtIHJlYWRfY3N2KCIuLi9vcmRlci1ib29rLXBsb3QtZmluZC9jdW1fZXJyb3JzL3Jlc291cmNlcy9mb3Jfd2ViX2FwcC9MS09ILUdNS04tMjAwNy0xMC0wOC0wOV9vcmRlcl9hdHRzX2N1bXN1bXMuY3N2IikNCiMgb3JkZXJfYXR0c19jdW1zdW1zX2RmIDwtIHJlYWRfY3N2KCIuLi9vcmRlci1ib29rLXBsb3QtZmluZC9jdW1fZXJyb3JzL3Jlc291cmNlcy9mb3Jfd2ViX2FwcC9MS09ILTIwMDctMTAtMDhfb3JkZXJfYXR0c19jdW1zdW1zLmNzdiIpDQojIG9yZGVyX2F0dHNfY3Vtc3Vtc19kZiA8LSByZWFkX2NzdigiLi4vb3JkZXItYm9vay1wbG90LWZpbmQvY3VtX2Vycm9ycy9yZXNvdXJjZXMvZm9yX3dlYl9hcHAvczFfczJfMjAwN19vcmRlcl9hdHRzX2N1bXN1bXMuY3N2IikNCm9yZGVyX2F0dHNfY3Vtc3Vtc19kZg0KYGBgDQoNCmBgYHtyfQ0Kb2JwX2N1bV9hdHRzX2RmIDwtIHJlYWRfY3N2KCIuLi9vcmRlci1ib29rLXBsb3QtZmluZC9jdW1fZXJyb3JzL3Jlc291cmNlcy9mb3Jfd2ViX2FwcC9MS09ILUdNS04tMjAwNy0xMC0wOC0wOV9vYnBfY3VtX2F0dHMuY3N2IikNCiMgb2JwX2N1bV9hdHRzX2RmIDwtIHJlYWRfY3N2KCIuLi9vcmRlci1ib29rLXBsb3QtZmluZC9jdW1fZXJyb3JzL3Jlc291cmNlcy9mb3Jfd2ViX2FwcC9MS09ILTIwMDctMTAtMDhfb2JwX2N1bV9hdHRzLmNzdiIpDQojIG9icF9jdW1fYXR0c19kZiA8LSByZWFkX2NzdigiLi4vb3JkZXItYm9vay1wbG90LWZpbmQvY3VtX2Vycm9ycy9yZXNvdXJjZXMvZm9yX3dlYl9hcHAvczFfczJfMjAwN19vYnBfY3VtX2F0dHMuY3N2IikNCm9icF9jdW1fYXR0c19kZg0KYGBgDQoNCmBgYHtyfQ0Kb3JkZXJfYXR0c19jdW1zdW1zX2VuaGFuY2VkX2RmIDwtIGxlZnRfam9pbihvcmRlcl9hdHRzX2N1bXN1bXNfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnBzX2RmICU+JSBzZWxlY3QoLU9CUExPVE5PLCAtU0VDQ09ERSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIk5PIiwgIkRBVEUiKSkgJT4lIA0KICBzZWxlY3QoTk8sIFNFQ0NPREUsIERBVEVUSU1FTUxMUywgUFJJQ0UsIFRSQURFUFJJQ0UsIFZPTFVNRSwgDQogICAgICAgICBEQVRFLCBUSU1FX1MsIE9CUExPVE5PLCBBVFQsIFZBTCwgDQogICAgICAgICBTSEFSRUJBTCwgQlBST0ZJVCwgU1BST0ZJVCwgT0JQTUlOVFBSSUNFLCBPQlBNQVhUUFJJQ0UsDQogICAgICAgICBDQk9WT0x0ZGNzLCBDU09WT0x0ZGNzLCBCT1ZPTHRkY3MsIFNPVk9MdGRjcywgQlRWT0x0ZGNzLCBTVFZPTHRkY3MsIA0KICAgICAgICAgQ0JPVk9Mb2JwY3MsIENTT1ZPTG9icGNzLCBCT1ZPTG9icGNzLCBTT1ZPTG9icGNzLCBCVFZPTG9icGNzLCBTVFZPTG9icGNzLA0KICAgICAgICAgc29icCwgYm9icCwgbWF4X3NvYnBfYm9icCwgbWludXNfbWF4X3NvYnBfYm9icCwgc3RkYXksIGJ0ZGF5LCBtYXhfc3RkX2J0ZCwNCiAgICAgICAgIG1pbnVzX21heF9zdGRfYnRkKQ0Kb3JkZXJfYXR0c19jdW1zdW1zX2VuaGFuY2VkX2RmDQpgYGANCg0KYGBge3J9DQpvYnBfbWlubWF4X2F0dHNfZGYgPC0gb3JkZXJfYXR0c19jdW1zdW1zX2VuaGFuY2VkX2RmICU+JSANCiAgc2VsZWN0KFNFQ0NPREUsIERBVEUsIE9CUExPVE5PLA0KICAgICAgICAgREFURVRJTUVNTExTLCBQUklDRSwgVFJBREVQUklDRSkgJT4lIA0KICBncm91cF9ieShTRUNDT0RFLCBEQVRFLCBPQlBMT1ROTykgJT4lIA0KICBzdW1tYXJpc2UoT0JQQkVHSU4gPSBtaW4oREFURVRJTUVNTExTKSwgT0JQRU5EID0gbWF4KERBVEVUSU1FTUxMUyksIA0KICAgICAgICAgICAgT0JQTUlOUFJJQ0UgPSBtaW4oUFJJQ0UpLCBPQlBNQVhQUklDRSA9IG1heChQUklDRSkpDQpvYnBfbWlubWF4X2F0dHNfZGYNCmBgYA0KDQpgYGB7cn0NCm9icF9jdW1fbWlubWF4X2F0dHNfZGYgPC0gbGVmdF9qb2luKG9icF9jdW1fYXR0c19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnBfbWlubWF4X2F0dHNfZGYgJT4lIHNlbGVjdChTRUNDT0RFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CUExPVE5PLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JQQkVHSU4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQlBFTkQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQlBNSU5QUklDRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CUE1BWFBSSUNFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiU0VDQ09ERSIsICJEQVRFIiwgIk9CUExPVE5PIikpICU+JSANCiAgc2VsZWN0KFNFQ0NPREUsIERBVEUsIE9CUExPVE5PLCBUUkFERVZPTCwgQlVZU0VMTE9CUCwNCiAgICAgICAgIE9CUEJFR0lOLCBPQlBFTkQsIE9CUE1JTlBSSUNFLCBPQlBNQVhQUklDRSwNCiAgICAgICAgIFRSQURFU05PVFJBREVTKSAjLCBCVVlTRUxMWUlFTEQsIE9CUFREVk9MUkFUSU8sIE1JTk1BWFJBVElPKQ0Kb2JwX2N1bV9taW5tYXhfYXR0c19kZg0KYGBgDQoNCmBgYHtyfQ0Kb2JwX2N1bV9hdHRzX2VuaF9kZiA8LSBpbm5lcl9qb2luKG9icF9jdW1fbWlubWF4X2F0dHNfZGYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJfYXR0c19jdW1zdW1zX2VuaGFuY2VkX2RmICU+JSBzZWxlY3QoU0VDQ09ERSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CUExPVE5PLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQUk9GSVQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BST0ZJVCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJTRUNDT0RFIiwgIkRBVEUiLCAiT0JQTE9UTk8iKSkgJT4lIA0KICBzZWxlY3QoU0VDQ09ERSwgREFURSwgT0JQTE9UTk8sIFRSQURFVk9MLCBCVVlTRUxMT0JQLA0KICAgICAgICAgQlBST0ZJVCwgU1BST0ZJVCwNCiAgICAgICAgIE9CUEJFR0lOLCBPQlBFTkQsIE9CUE1JTlBSSUNFLCBPQlBNQVhQUklDRSwNCiAgICAgICAgIFRSQURFU05PVFJBREVTKSAlPiUgIywgQlVZU0VMTFlJRUxELCBPQlBURFZPTFJBVElPLCBNSU5NQVhSQVRJTykgJT4lIA0KICByZW5hbWUoInNlY2NvZGUiID0gIlNFQ0NPREUiLA0KICAgICAgICAgImRkYXRlIiA9ICJEQVRFIiwNCiAgICAgICAgICJvYnBsb3RubyIgPSAiT0JQTE9UTk8iLA0KICAgICAgICAgInRyYWRldm9sIiA9ICJUUkFERVZPTCIsDQogICAgICAgICAiYnV5c2VsbG9icCIgPSAiQlVZU0VMTE9CUCIsDQogICAgICAgICAiYnByb2ZpdCIgPSAiQlBST0ZJVCIsDQogICAgICAgICAic3Byb2ZpdCIgPSAiU1BST0ZJVCIsDQogICAgICAgICAib2JwYmVnaW4iID0gIk9CUEJFR0lOIiwNCiAgICAgICAgICJvYnBlbmQiID0gIk9CUEVORCIsDQogICAgICAgICAib2JwbWlucHJpY2UiID0gIk9CUE1JTlBSSUNFIiwNCiAgICAgICAgICJvYnBtYXhwcmljZSIgPSAiT0JQTUFYUFJJQ0UiLA0KICAgICAgICAgImJwcm9maXQiID0gIkJQUk9GSVQiLA0KICAgICAgICAgInNwcm9maXQiID0gIlNQUk9GSVQiLA0KICAgICAgICAgInRyYWRlc25vdHJhZGVzIiA9ICJUUkFERVNOT1RSQURFUyIpICU+JSANCiAgZGlzdGluY3QoKQ0KICAgICAgICAgIyAiYnV5c2VsbHlpZWxkIiA9ICJCVVlTRUxMWUlFTEQiLA0KICAgICAgICAgIyAib2JwdGR2b2xyYXRpbyIgPSAiT0JQVERWT0xSQVRJTyIsDQogICAgICAgICAjICJtaW5tYXhyYXRpbyIgPSAiTUlOTUFYUkFUSU8iKQ0Kb2JwX2N1bV9hdHRzX2VuaF9kZg0KYGBgDQoNCmBgYHtyfQ0KdGRfdm9sX3N1bV9kZiA8LSBvYnBfY3VtX2F0dHNfZW5oX2RmICU+JSANCiAgZ3JvdXBfYnkoc2VjY29kZSwgZGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKHRkdm9sc3VtID0gc3VtKHRyYWRldm9sKSkNCg0Kb2JwX2N1bV9hdHRzX2VuaF92b2xhcnJhbmdlZF9kZiA8LSBsZWZ0X2pvaW4ob2JwX2N1bV9hdHRzX2VuaF9kZiwNCiAgICAgICAgICB0ZF92b2xfc3VtX2RmLA0KICAgICAgICAgIGJ5ID0gYygic2VjY29kZSIsICJkZGF0ZSIpKSAlPiUgDQogIG11dGF0ZShvYnBzaGFyZWludGQgPSB0cmFkZXZvbCAvIHRkdm9sc3VtKSAlPiUgDQogIHNlbGVjdCgtdGR2b2xzdW0pICU+JSANCiAgYXJyYW5nZShzZWNjb2RlLCBkZGF0ZSwgZGVzYyhvYnBzaGFyZWludGQpKQ0KDQpvcHRpb25zKGRpZ2l0cy5zZWNzID0gMykNCm9icF9jdW1fYXR0c19lbmhfdm9sYXJyYW5nZWRfZGYgJT4lDQogIHdyaXRlX2NzdigiLi4vb3JkZXItYm9vay1wbG90LWZpbmQvY3VtX2Vycm9ycy9yZXNvdXJjZXMvZm9yX3dlYl9hcHAvb2JwX2N1bV9hdHRzX2VuaF9kZi5jc3YiLA0KICAgICAgICAgICAgbmEgPSAiIikNCg0Kb2JwX2N1bV9hdHRzX2VuaF92b2xhcnJhbmdlZF9kZg0KYGBgDQoNCmBgYHtyfQ0Kb3JkZXJfYXR0c19jdW1zdW1zX2VuaDJfZGYgPC0gb3JkZXJfYXR0c19jdW1zdW1zX2VuaGFuY2VkX2RmICU+JSANCiAgbXV0YXRlKHBjb2xvciA9IGlmX2Vsc2UoQVRUID09ICJCT1ZPTCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiYXF1YW1hcmluZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKEFUVCA9PSAiU09WT0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMwMDQ0ODEiKSksDQogICAgICAgICBwc2hhcGUgPSA0TCwNCiAgICAgICAgIHBzaXplID0gMC41KQ0Kb3JkZXJfYXR0c19jdW1zdW1zX2VuaDJfZGYNCmBgYA0KDQpgYGB7cn0NCm9yZGVyX2F0dHNfY3Vtc3Vtc19lbmg0X2RmIDwtIG9yZGVyX2F0dHNfY3Vtc3Vtc19lbmgyX2RmICU+JSANCiAgYXJyYW5nZShTRUNDT0RFLCBEQVRFLCBOTykgJT4lIA0KICByZW5hbWUoIm5ubyIgPSAiTk8iLA0KICAgICAgICAgInNlY2NvZGUiID0gIlNFQ0NPREUiLA0KICAgICAgICAgImRhdGV0aW1lbWxscyIgPSAiREFURVRJTUVNTExTIiwNCiAgICAgICAgICJwcmljZSIgPSAiUFJJQ0UiLA0KICAgICAgICAgInRyYWRlcHJpY2UiID0gIlRSQURFUFJJQ0UiLA0KICAgICAgICAgInZvbHVtZSIgPSAiVk9MVU1FIiwNCiAgICAgICAgICJkZGF0ZSIgPSAiREFURSIsDQogICAgICAgICAidHRpbWVfcyIgPSAiVElNRV9TIiwNCiAgICAgICAgICJvYnBsb3RubyIgPSAiT0JQTE9UTk8iLA0KICAgICAgICAgImF0dCIgPSAiQVRUIiwNCiAgICAgICAgICJ2YWwiID0gIlZBTCIsDQogICAgICAgICAic2hhcmViYWwiID0gIlNIQVJFQkFMIikgJT4lIA0KICBzZWxlY3QoLUJQUk9GSVQsIC1TUFJPRklULCAtT0JQTUlOVFBSSUNFLCAtT0JQTUFYVFBSSUNFKQ0KIyBvcHRpb25zKGRpZ2l0cy5zZWNzID0gMykNCm9yZGVyX2F0dHNfY3Vtc3Vtc19lbmg0X2RmICU+JQ0KICB3cml0ZV9jc3YoIi4uL29yZGVyLWJvb2stcGxvdC1maW5kL2N1bV9lcnJvcnMvcmVzb3VyY2VzL2Zvcl93ZWJfYXBwL29yZGVyX2F0dHNfY3Vtc3Vtc19lbmg0X2RmLmNzdiIsDQogICAgICAgICAgICBuYSA9ICIiKQ0Kb3JkZXJfYXR0c19jdW1zdW1zX2VuaDRfZGYNCmBgYA0KDQo=